按钮
如何添加按钮
添加 Toolbar 按钮
thisApp.listOnTableLoaded = async (ctx) => {
const list = ctx.getListContext().list;
// 添加批量按钮
list.getToolbar().addButton({
key: 'batchDelete',
text: '批量删除',
onClick: (clickCtx) => {
const masterIds = Array.from(new Set(clickCtx.getListContext().list.selectedRows.map(row => row.masterRowNode.id)));
// do batch delete
await batchDelete(masterIds);
// 删除后刷新列表数据
clickCtx.getListContext().list.refresh();
}
})
}
添加行按钮
thisApp.listOnTableLoaded = async (ctx) => {
const list = ctx.getListContext().list;
// 添加行按钮
list.getToolbar().addButton({
key: 'delete',
text: '删除',
onClick: (clickCtx) => {
// 当前行的表头 ID
const masterId = clickCtx.getCurrent().row.masterRowNode.id;
// do batch delete
await batchDelete([masterId]);
// 删除后刷新列表数据
clickCtx.getListContext().list.refresh();
}
})
}
根据 listNode 上下文信息添加按钮
- 展示模式(整单、明细)
thisApp.listOnTableLoaded = async (ctx) => {
const list = ctx.getListContext().list;
// isSubGridMode 代表是否是明细模式
if (list.isSubGridMode) {
// 明细模式时添加行按钮
list.getRowActionBar().addButton({
key: 'detailDelete',
text: '明细删除',
onClick: (clickCtx) => {
}
})
}
if (!list.isSubGridMode) {
// 整单模式时添加整单删除按钮
list.getRowActionBar().addButton({
key: 'masterDelete',
text: '整单删除',
onClick: (clickCtx) => {
}
})
}
}
- 列表实体对象
thisApp.listOnTableLoaded = async (ctx) => {
const list = ctx.getListContext().list;
// entityName 当前列表实体,栏目、查询数据时的实体
if (list.entityName === 'ReimburseItem') {
// 实体为报销单明细时添加明细删除按钮
list.getRowActionBar().addButton({
key: 'detailDelete',
text: '明细删除',
onClick: (clickCtx) => {
}
})
}
if (list.entityName === 'Reimburse') {
// 实体为报销单时添加整单删除按钮
list.getRowActionBar().addButton({
key: 'masterDelete',
text: '整单删除',
onClick: (clickCtx) => {
}
})
}
}
按钮状态管理
按钮实例的状态有两个属性:
- visible, 控制按钮显示/隐藏(UI不可见)
- disabled, 控制按钮的禁用/启用状态(UI可见,决定是否能点击)
按钮状态可以通过对应位置的按钮APi获取到按钮实例直接进行赋值操作,如下以toolbar和行按钮举例
toolbar 按钮状态控制
// 添加批量删除按钮
thisApp.listOnTableLoaded = (ctx) => {
// 1.添加 toolbar 区域批量删除按钮
ctx.getListContext().list.getToolbar().addButton({
key: 'batch-delete',
text: '批量删除',
onClick: (clickCtx) => {
// execute delete
}
})
// 2.获取按钮实例设置状态
const batchDeleteBtn = ctx.getListContext().list.getToolbar().getButton('batch-delete');
ctx.getListContext().runInAction(() => {
// 设置禁用状态
batchDeleteBtn.disabled = true;
// 设置显示状态
batchDeleteBtn.visible = false;
})
}
行按钮状态控制
// 添加批量删除按钮
thisApp.listOnTableLoaded = (ctx) => {
// 1.添加行删除按钮
ctx.getListContext().list.getToolbar().addButton({
key: 'batch-delete',
text: '批量删除',
onClick: (clickCtx) => {
// execute delete
}
})
}
// 行按钮比较特殊,依赖于行数据所以需在 listOnTableDataChanged 中处理状态
thisApp.listOnTableDataChanged = (ctx) => {
const rowActionBar = ctx.getListContext().list.getRowActionBar();
// 2.当数据加载完毕后获取行按钮实例设置状态
ctx.getListContext().list.rows.forEach((row) => {
const deleteBtn = rowActionBar.getRowButton('delete', row.rowIndex);
ctx.getListContext().runInAction(() => {
// 设置禁用状态
deleteBtn.disabled = true;
// 设置显示状态
deleteBtn.visible = false;
})
})
}
按钮的显示/隐藏、禁用/启用往往和数据和使用场景有关,下面提供和数据挂钩控的制按钮状态场景示例。
根据选中行设置按钮状态
下面的例子根据是否有选中行设置按钮的禁用状态
caution
如果按钮的状态与选中行有关,只能在 listOnRowSelectedChanged
事件中设置按钮的状态
// 添加批量删除按钮
thisApp.listOnTableLoaded = (ctx) => {
ctx.getListContext().list.getToolbar().addButton({
key: 'batch-delete',
text: '批量删除',
onClick: (clickCtx) => {
// execute delete
}
})
}
// 监听选中行变化
thisApp.listOnRowSelectedChanged = (ctx) => {
const list = ctx.getListContext().list;
// 设置禁用状态
list.getToolbar().getButton('batch-delete').disabled = list.selectedRows.length === 0;
}
根据行数据控制行按钮状态
下面的例子根据是行的的单据完全状态是否是审批中设置按钮的visible
caution
如果按钮的状态与数据有关,只能在 listOnTableDataChanged
事件中设置按钮的状态
// 添加行审批按钮
thisApp.listOnTableLoaded = (ctx) => {
ctx.getListContext().list.getRowActionBar().addButton({
key: 'approval',
text: '审批',
onClick: (clickCtx) => {
// execute approval
}
})
}
// 监听选中行变化
thisApp.listOnTableDataChanged = (ctx) => {
const list = ctx.getListContext().list;
const rowActionBar = list.getRowActionBar();
list.rows.forEach(row => {
// 根据行是否处理待审批控制审批按钮是否显示
rowActionBar.getButton('approval', row.rowIndex).visible = row.billFullStatusObject.id === 'BillStatus.approving';
})
}
根据整单明细模式/实体控制按钮状态
caution
不推荐使用展示模式/实体对象控制按钮状态。 推荐根据不同模式/实体有效添加按钮。下面例子根据模式添加按钮。
// 添加行审批按钮
thisApp.listOnTableLoaded = (ctx) => {
const list = ctx.getListContext().list;
if (list.isSubGridMode) {
// 如果是明细模式则添加行审批
list.getRowActionBar().addButton({
key: 'detail-approval',
text: '明细审批',
onClick: (clickCtx) => {
// execute approval
}
})
} else {
// 否则整单模式添加批量审批
list.getToolbar().addButton({
key: 'master-approval',
text: '整单审批',
onClick: (clickCtx) => {
// execute approval
}
})
}
}